package com.ihrm.system.service.impl;

import com.ihrm.common.service.BaseService;
import com.ihrm.common.utils.IdWorker;
import com.ihrm.common.utils.QiniuUploadUtils;
import com.ihrm.domain.company.Department;
import com.ihrm.domain.system.Role;
import com.ihrm.domain.system.User;
import com.ihrm.system.dao.RoleDao;
import com.ihrm.system.dao.UserDao;
import com.ihrm.system.feign.DepartmentFeignClient;
import com.ihrm.system.service.UserService;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.io.IOException;
import java.util.*;

/**
 * @author 小伟
 * @version V1.0
 * @Package com.ihrm.system.service.impl
 * @date 2020/12/12 17:46
 * @Copyright © 2020-2021 郑州恒星科技有限责任公司
 */
@Service
public class UserServiceImpl extends BaseService<UserServiceImpl> implements UserService {
    /**
     * 注入dao接口
     */
    @Autowired
    UserDao userDao;
    /**
     * 注入生成工具id类
     */
    @Autowired
    IdWorker idWorker;

    @Autowired
    RoleDao roleDao;
    @Autowired
    DepartmentFeignClient departmentFeignClient;

    /**
     * 根据企业id查询全部员工
     *
     * @param companyId
     * @return
     */
    @Override
    public List<User> findAllSimple(String companyId) {
        return userDao.findAll(super.getSpecification(companyId));
    }

    /**
     * 添加部门信息
     *
     * @param user 部门对象
     */
    @Override
    public void saveUser(User user) {
        String id = idWorker.nextId() + "";
        user.setId(id);
        //设置初始密码并加密
        String password = new Md5Hash("123456", user.getMobile(), 3).toString();
        user.setPassword(password);
        user.setEnableState(1);
        user.setInServiceStatus(1);
        user.setCreateTime(new Date());
        //设置初始用户级别
        user.setLevel("user");
        userDao.save(user);
    }

    /**
     * 修改部门信息
     *
     * @param user 部门对象
     */
    @Override
    public void updateUser(User user) {
        userDao.save(user);
    }

    /**
     * 根据id查询部门信息
     *
     * @param id 部门id
     * @return 部门信息
     */
    @Override
    public User findById(String id) {
        return userDao.findById(id).get();
    }

    /**
     * 查询企业全部用户信息
     *
     * @param page 页码
     * @param size 页面大小
     * @param map  参数列表
     * @return 用户列表
     */
    @Override
    public Page<User> findAll(int page, int size, Map<String, Object> map) {

        Specification<User> spec = new Specification<User>() {
            @Override
            public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
                List<Predicate> predicateList = new ArrayList<>();
                //根据传递的map中的条件构造查询参数
                if (!StringUtils.isEmpty(map.get("companyId"))) {
                    predicateList.add(criteriaBuilder.equal(root.get("companyId").as(String.class), (String) map.get(
                            "companyId")));
                }
                if (!StringUtils.isEmpty(map.get("departmentId"))) {
                    predicateList.add(criteriaBuilder.equal(root.get("departmentId").as(String.class), (String) map.get(
                            "departmentId")));
                }
                if(!StringUtils.isEmpty(map.get("hasDept"))) {
                    //根据请求的hasDept判断  是否分配部门 0未分配（departmentId = null），1 已分配 （departmentId ！= null）
                    if("0".equals((String) map.get("hasDept"))) {
                        predicateList.add(criteriaBuilder.isNull(root.get("departmentId")));
                    }else {
                        predicateList.add(criteriaBuilder.isNotNull(root.get("departmentId")));
                    }
                }
                return criteriaBuilder.and(predicateList.toArray(new Predicate[predicateList.size()]));
            }
        };
        Page<User> pageUser= userDao.findAll(spec, PageRequest.of(page-1,size));

        return pageUser;
    }

    /**
     * 根据部门id删除部门
     *
     * @param id 部门id
     */
    @Override
    public void deleteById(String id) {
        userDao.deleteById(id);
    }

    /**
     * 为用户分配角色
     *
     * @param userId  用户id
     * @param roleIds 角色id集合
     */
    @Override
    public void assignRoles(String userId, List<String> roleIds) {
        User user = userDao.findById(userId).get();
        Set<Role> roles = new HashSet<>();
        for (String roleId : roleIds) {
            Role role = roleDao.findById(roleId).get();
            roles.add(role);
        }
        user.setRoles(roles);
        userDao.save(user);
    }

    /**
     * 用户登录
     * @param mobile   用户名（手机号码）
     * @return 登录结果
     */
    @Override
    public User findByMobile(String mobile) {
        return userDao.findByMobile(mobile);
    }

    /**
     * 批量添加用户信息
     *
     * @param userList 用户集合
     */
    @Override
    public void addAll(List<User> userList,String companyId,String companyName) {
        for (User user : userList) {
            user.setId(idWorker.nextId()+"");
            user.setCompanyName(companyName);
            user.setCompanyId(companyId);
            String password = new Md5Hash("123456", user.getMobile(), 3).toString();
            user.setPassword(password);
            user.setEnableState(1);
            user.setInServiceStatus(1);
            user.setCreateTime(new Date());
            //设置初始用户级别
            user.setLevel("user");
            //根据部门code和companyId获取部门对象（使用feign调用企业微服务）
            Department department = departmentFeignClient.findByCode(user.getDepartmentId(), companyId);
            if (department != null) {
                user.setDepartmentId(department.getId());
                user.setDepartmentName(department.getName());
            }
            userDao.save(user);
        }
    }

    /**
     * 上传用户头像
     *
     * @param id   用户id
     * @param file 头像文件
     * @return 头像访问URL
     */
    @Override
    public String uploadStaffPhoto(String id, MultipartFile file) throws IOException {
        //根据id获取用户信息
        User user = userDao.findById(id).get();
        //上传头像并获取返回的头像访问URL
        String imgUrl = new QiniuUploadUtils().fileUpload(user.getId(), file.getBytes());
        user.setStaffPhoto(imgUrl);
        //更新用户头像
        userDao.save(user);
        return imgUrl;
    }
}
